package iot_hmbirdthing

import (
	"encoding/json"
	"github.com/winc-link/hummingbird-sdk-go/model"
)

// ThingDataItem 子数据项
type ThingDataItem struct {
	Code     string            `json:"code"`      // 参数唯一标识符
	Name     string            `json:"name"`      // 参数名称
	TypeSpec ThingDataTypeSpec `json:"type_spec"` // 参数的数据类型
}

type ThingDataTypeSpec struct {
	Type  string    `json:"type"`
	Specs IDataSpec `json:"specs"`
}

// ParseTypeSpecContent 解析type spec 内容，hm里存的是json字符串
func ParseTypeSpecContent(data model.TypeSpec) ThingDataTypeSpec {
	typeSpec := ThingDataTypeSpec{
		Type: data.Type,
	}

	spec := ParseType(data.Type)
	//不支持的类型直接返回
	if spec == nil {
		return typeSpec
	}

	//针对特殊结构进行子元素结构确认
	//fmt.Printf("spec %+v\n", spec)
	if tmp, ok := spec.(*ArrayData); ok {
		json.Unmarshal([]byte(data.Specs), spec) //先解析一波得到内容项的类型
		tmp.Specs = ParseType(tmp.Type)
	}
	if tmp, ok := spec.(*StructData); ok {
		json.Unmarshal([]byte(data.Specs), spec) //先解析一波得到内容项的类型
		for k, v := range *tmp {
			(*tmp)[k].TypeSpec.Specs = ParseType(v.TypeSpec.Type)
		}
	}

	//最终解析
	json.Unmarshal([]byte(data.Specs), spec)
	//fmt.Printf("SPEC %+v\n", spec)
	typeSpec.Specs = spec

	return typeSpec
}

func ParseType(t string) IDataSpec {
	for _, v := range DataSpecList {
		if v.TypeName() == t {
			return v.Copy()
		}
	}
	return nil
}
